package main

import (
	"encoding/json"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Username    string `json:"username" gorm:"column:username"`
	CreditCards []CreditCard
}
type CreditCard struct {
	gorm.Model
	Number string
	//外键
	UserID uint
}

func main() {
	// 0、连接数据库
	dsn := "root:chencheng233@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	// 1、预加载: 查找 user 时预加载相关 CreditCards
	//users := User{Username: "zhangsan"}
	users := []User{}
	//db.Preload("CreditCards") 意味着在查询时预加载 "CreditCards" 关联对象的数据，即获取与用户对象关联的信用卡（CreditCards）数据。
	//该查询在执行 Find(&users) 以获取所有用户对象时生效，
	//因此每个用户的 CreditCards 数据都将被加载到内存中，从而避免了在后续访问 CreditCards 时出现 N+1 查询问题。

	db.Preload("CreditCards").Find(&users)

	strUser, _ := json.Marshal(&users)
	fmt.Println(string(strUser))

}
